home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Extensions / Imaging / PIL / SgiImagePlugin.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.0 KB  |  90 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: SgiImagePlugin.py,v 1.1.1.1 1998/08/18 13:07:52 sjoerd Exp $
  4. #
  5. # SGI image file handling
  6. #
  7. # See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli.
  8. # <ftp://ftp.sgi.com/graphics/SGIIMAGESPEC>
  9. #
  10. # History:
  11. #    95-09-10 fl    Created
  12. #
  13. # Copyright (c) Secret Labs AB 1997.
  14. # Copyright (c) Fredrik Lundh 1995.
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19.  
  20. __version__ = "0.1"
  21.  
  22.  
  23. import regex, string
  24. import Image, ImageFile
  25.  
  26.  
  27. def i16(c):
  28.     return ord(c[1]) + (ord(c[0])<<8)
  29.  
  30. def i32(c):
  31.     return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
  32.  
  33.  
  34. def _accept(prefix):
  35.     return i16(prefix) == 474
  36.  
  37.  
  38. class SgiImageFile(ImageFile.ImageFile):
  39.  
  40.     format = "SGI"
  41.     format_description = "SGI Image File Format"
  42.  
  43.     def _open(self):
  44.  
  45.     # HEAD
  46.     s = self.fp.read(512)
  47.     if i16(s) != 474:
  48.         raise SyntaxError, "not an SGI image file"
  49.  
  50.     # relevant header entries
  51.     compression = ord(s[2])
  52.  
  53.     # bytes, dimension, zsize
  54.     layout = ord(s[3]), i16(s[4:]), i16(s[10:])
  55.  
  56.     # determine mode from bytes/zsize
  57.     if layout == (1, 2, 1):
  58.         self.mode = "L"
  59.     elif layout == (1, 3, 3):
  60.         self.mode = "RGB"
  61.     else:
  62.         raise SyntaxError, "unsupported SGI image mode"
  63.  
  64.     # size
  65.     self.size = i16(s[6:]), i16(s[8:])
  66.  
  67.     # decoder info
  68.     if compression == 0:
  69.         if self.mode == "RGB":
  70.         # RGB images are band interleaved
  71.         size = self.size[0]*self.size[1]
  72.         self.tile = [("raw", (0,0)+self.size, 512, ("R",0,1)),
  73.                  ("raw", (0,0)+self.size, 512+size, ("G",0,1)),
  74.                  ("raw", (0,0)+self.size, 512+2*size, ("B",0,1))]
  75.         else:
  76.         self.tile = [("raw", (0,0)+self.size, 512, (self.mode, 0, 1))]
  77.     if compression == 1:
  78.         self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, 1))]
  79.  
  80. #
  81. # registry
  82.  
  83. Image.register_open("SGI", SgiImageFile, _accept)
  84.  
  85. Image.register_extension("SGI", ".bw")
  86. Image.register_extension("SGI", ".rgb")
  87. Image.register_extension("SGI", ".rgba")
  88.  
  89. Image.register_extension("SGI", ".sgi") # really?
  90.